package cn.itcast.com.homework.day87;


import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * @author zhangshuai@Cskaoyan.onaliyun.com on 2020/4/1.
 * @version 1.0
 *
 * 在配置文件中，配置目标类(全类名，该类必须有无参构造方法)，和目标方法(名称)(无参方法)。
 *  通过反射，调用目标类中的目标方法
 *  假设该类中一定有默认无参构造方法
 *
 */
public class test2 {

    public static void main(String[] args) throws NoSuchMethodException, IOException, InstantiationException, IllegalAccessException, InvocationTargetException, ClassNotFoundException {
        callTargetMethod("D:\\代码\\代码\\代码\\cn\\itcast\\com\\homework\\day87\\configuration.properties");
    }

    /**
     *
     * @param configFilePath  表示配置文件的路径
     */
    public static void callTargetMethod(String configFilePath) throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {

        //1. 读取配置文件信息，将去读取到我们的Properties对象中
        //创建Properties对象,读取配置文件，读取文件地址
        Properties properties = new Properties();
        properties.load(new InputStreamReader(new FileInputStream(configFilePath),"GBK"));

        //2. 从Properties对象中，获取指定类的全类名和指定的方法名
        String className = properties.getProperty("className");
        String methodName = properties.getProperty("methodName");
        System.out.println(className);
        System.out.println(methodName);

        //3. 通过全类名，获取全类名所指定的类的，类型信息(通过访问其对应Class)
        Class targetClass =  Class.forName(className);

        //4. 利用反射，创建目标对象  Constructor对象.newInstance()
        Constructor cons = targetClass.getDeclaredConstructor();
        Object o = cons.newInstance();

        //5. 利用反射，targetClass中获取，目标方法(Method对象)
        Method method = targetClass.getDeclaredMethod(methodName);

        //6. Method对象.invoke(目标对象)
        method.invoke(o,null);

    }

}


class TargetClass {
    public void test() {
        System.out.println("调用了方法");
    }
}
